#ifdef __cplusplus
#include <iostream>
#include <sys/types.h> // key_t, pid_t 等类型定义（所有IPC的基础）
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/msg.h>
#include <stdio.h>  // perror() 错误打印
#include <stdlib.h> // exit(), NULL
#include <string.h> // memcpy(), strerror()
#include <errno.h>
//信号量封装
union semun{
    int val;
    struct semid_ds*buf;
    unsigned short*array;
    struct seminfo*__buf;
};

class  Sem
{
public:
    Sem();
    ~Sem();
    int sem_create(key_t key,int num_sems);
    int semid;
    int sem_setval(int semid,int semindex,int val);
    int sem_p(int semid,int semindex);
    int sem_v(int semid,int semindex);

private:

};

//1.创建信号量
// int sem_create(key_t key,int num_sems)
// {
//     int res=0;
//     res=semget(key,num_sems,IPC_CREAT|0666);
//     if(res<0)
//     {
//         perror("semget error");
//         return 0;
//     }
//     return res;
// }
// //2.设置信号量
// int  sem_setval(int semid,int semindex,int val)
// {
//     union semun arg;
//     arg.val=val;
//     int res=semctl(semid,semindex,SETVAL,arg);
    
//     return res;
// }

// //信号量p操作
// int sem_p(int semid,int semindex)
// {
//     int res=0;
//     struct sembuf buf={semindex,-1,SEM_UNDO};
//     res=semop(semid,&buf,1);
//     if(res<0)
//     {
//         perror("semop error ");
//         return 0;
//     }
//     return res;
// }

// //信号量V操作
// int sem_v(int semid,int semindex)
// {
//     int res=0;
//     struct sembuf buf={semindex,1,SEM_UNDO};
//     res=semop(semid,&buf,1);
//     if(res<0)
//     {
//         perror("semop error ");
//         return 0;
//     }
//     return res;
// }

#endif